package com.xinxi11.project.qx.action;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.time.DateUtils;

import com.xinxi11.module.core.web.struts2.CrudStruts2ActionSupport;
import com.xinxi11.module.core.web.struts2.Struts2Utils;
import com.xinxi11.project.qx.beans.QxModule;
import com.xinxi11.project.qx.services.IQxModuleService;

/**
 * 模块管理acton
 * 
 * @author 李国江
 * @date 2011-4-29
 */
public class QxModuleAction extends CrudStruts2ActionSupport {
	
	private static final long serialVersionUID = 2320957624020201760L;
	
	private IQxModuleService qxModuleService;
	private QxModule qxModule;
	private String message; // 提示信息
	private Long userId;

	public QxModule getQxModule() {
		return qxModule;
	}

	public void setQxModule(QxModule qxModule) {
		this.qxModule = qxModule;
	}

	public IQxModuleService getQxModuleService() {
		return qxModuleService;
	}

	public void setQxModuleService(IQxModuleService qxModuleService) {
		this.qxModuleService = qxModuleService;
	}

	/**
	 * 跳转到模块管理
	 * 
	 * @throws Exception
	 */
	@Override
	public String list() throws Exception {
		// 获取所有顶级模块的信息
		findTopQxModule();
		return "list";
	}

	/**
	 * 获取所有顶级模块的信息
	 * 
	 * @throws Exception
	 */
	public void findTopQxModule() throws Exception {
		List<QxModule> modules = qxModuleService.findQxModuleByParentId(); // 查询模块大类
		if (CollectionUtils.isNotEmpty(modules)) {
			Struts2Utils.getRequest().setAttribute("modules", modules);
		}
	}

	/**
	 * ajax获取所有模块
	 * 
	 * @throws Exception
	 */
	public void ajaxModuleTree() throws Exception {
		JSONArray array = null;
		Integer display = Struts2Utils.getIntegerParameter("display");
		if (qxModule != null && StringUtils.isNotBlank(qxModule.getId())) {
			array = qxModuleService.findArrayJonsModuleByModuleId(qxModule.getId(), display);
		} else {
			array = qxModuleService.findArrayJonsModuleByModuleId(null, display);
		}
		Struts2Utils.renderJson(array);
	}

	/**
	 * ajax根据模块和角色获取对应模块
	 * 
	 * @throws Exception
	 */
	public void ajaxfindArrayJsonQxModuleByRoleIdModuleId() throws Exception {
		JSONArray array = null;
		Integer display = Struts2Utils.getIntegerParameter("display");
		String roleId = Struts2Utils.getParameter("roleId");
		String moduleId = Struts2Utils.getParameter("moduleId");
		String rootRole = Struts2Utils.getParameter("rootRole");
		if (StringUtils.isBlank(roleId) || StringUtils.isBlank(moduleId))
			return;
		boolean flag = StringUtils.isNotBlank(rootRole) && rootRole.equals("true") ? true : false;
		array = qxModuleService.findArrayJsonQxModuleByRoleIdModuleId(roleId, moduleId, flag, display);
		Struts2Utils.renderJson(array);
	}

	/**
	 * 查询角色对应的模块树
	 * 
	 * @throws Exception
	 */
	public void ajaxRoleModuleTree() throws Exception {
		JSONArray jArray = qxModuleService.findArrayJsonModuleByRoleId(sid);
		Struts2Utils.renderJson(jArray);
	}

	/** 查询岗位对应的模块树 */
	public void ajaxDutyModuleTree() {

	}

	/**
	 * 跳转到查询用户对应的模块树
	 * 
	 * @throws Exception
	 */
	public String toUserModuleTree() throws Exception {
		return SUCCESS;
	}

	/**
	 * 查询用户对应的模块树
	 * 
	 * @throws Exception
	 */
	public void ajaxUserModuleZTree() throws Exception {
		Long userId = getLoginUser().getId();
		if (userId == null)
			return;
		JSONArray array = qxModuleZTreeService.findArrayJonsModuleByUserId(userId);

		JSONObject json = qxModuleZTreeService.findArrayJonsModulePageLiknByUserId(userId);
		if (array != null && array.size() > 0 && json != null) {
			array.add(0, json);
			Struts2Utils.renderJson(array);
		} else if (json != null) {
			Struts2Utils.renderJson(json);
		} else {
			Struts2Utils.renderJson(array);
		}
	}

	/**
	 * 查询用户对应的模块树
	 * 
	 * @throws Exception
	 */
	public void ajaxUserModuleTree() throws Exception {
		Long userId = getLoginUser().getId();
		if (userId == null)
			return;
		JSONArray array = qxModuleService.findArrayJonsModuleByUserId(userId);

		JSONObject json = qxModuleService.findArrayJonsModulePageLiknByUserId(userId);
		if (array != null && array.size() > 0 && json != null) {
			array.add(0, json);
			Struts2Utils.renderJson(array);
		} else if (json != null) {
			Struts2Utils.renderJson(json);
		} else {
			Struts2Utils.renderJson(array);
		}
	}

	/** 查询角色(岗位)与模块下的属性与操作权限数据 */
	@SuppressWarnings("unchecked")
	public void ajaxFieldOperation() throws Exception {
		Map m = qxModuleService.findOpersFieldsByIds(getSid());
		// find opers
		List<String> opers = null;
		if (m.get("opers") != null) {
			opers = (List<String>) m.get("opers");
		}
		// find attrs
		List<String> attrs = null;
		if (m.get("attrs") != null) {
			attrs = (List<String>) m.get("attrs");
		}
		// ///--------for test
		// List<String> opers =new ArrayList<String>();
		// opers.add("添加");
		// opers.add("修改");
		// List<String> attrs = new ArrayList<String>();
		// attrs.add("父模块名称");
		// attrs.add("模块名称");
		// json
		JSONObject obj = new JSONObject();
		obj.put("opers", opers);
		obj.put("attrs", attrs);
		Struts2Utils.renderJson(obj);
	}

	/** 跳转到添加模块信息 @throws Exception */
	public String tosave() throws Exception {
		qxModule.setId(null);
		if (StringUtils.isBlank(qxModule.getParentId())) {
			qxModule.setParentName("根节点");
		}
		return "edit";
	}

	/** 添加模块信息 @throws Exception */
	public String save() throws Exception {
		qxModule.setDesplay(2);
		boolean flag = qxModuleService.saveQxModule(qxModule);
		if (flag) {
			message = "模块保存成功";
		} else {
			message = "模块保存失败";
		}
		
		Struts2Utils.getRequest().setAttribute("message", message);
		return RELOAD;
	}

	/** 跳转修改模块信息 @throws Exception */
	public String toupdate() throws Exception {
		qxModule = qxModuleService.findModuleByModuleId(qxModule.getId());
		return "edit";
	}

	/** 修改模块信息 @throws Exception */
	public String update() throws Exception {
		boolean flag = qxModuleService.updateQxModule(qxModule);
		if (flag) {
			message = "模块修改成功";
		} else {
			message = "模块修改失败";
		}
		Struts2Utils.getRequest().setAttribute("message", message);
		return RELOAD;
	}

	/**
	 * 查看模块下权限
	 */
	public String look() throws Exception {
		if (StringUtils.isBlank(qxModule.getId()))
			throw new Exception("异常：查看模块的为空，请从新选择!");
		List<String> opersQx = qxModuleService.findModuleQxList(qxModule.getId());
		List<QxModuleDto> dtos = qxModuleService.findRoleModuleOperQx(qxModule.getId());
		List<QxField> qxFields = qxModuleService.findByModuledId(qxModule.getId());
		HttpServletRequest req = Struts2Utils.getRequest();
		QxModule module = qxModuleService.findModuleByModuleId(qxModule.getId());
		String url = module != null && StringUtils.isNotBlank(module.getSubmitUrl()) ? module.getSubmitUrl()
				: module != null ? module.getPageUrl() : null;
		if (StringUtils.isNotBlank(url)) {
			req.setAttribute("url", url);
		}
		if (CollectionUtils.isNotNull(opersQx)) {
			req.setAttribute("opersQx", opersQx.toString());
		}
		if (CollectionUtils.isNotNull(dtos)) {
			req.setAttribute("dtos", dtos);
		}
		if (CollectionUtils.isNotNull(qxFields)) {
			req.setAttribute("qxFields", qxFields);
		}
		return LOOK;
	}

	/** 逻辑删除模块信息 @throws Exception */
	public void ajaxDeleteModule() throws Exception {
		boolean flag = qxModuleService.deleteModuleNode(qxModule.getId());
		Struts2Utils.renderText(flag + "");
	}

	/** ajax根据模块Id查询模块的详细信息 */
	public void ajaxModuleInfo() throws Exception {
		QxModule qxModuleInfo = qxModuleService.findModuleByModuleId(qxModule.getId());
		Struts2Utils.renderJson(new ObjectMapper().writeValueAsString(moduleInfoMap(qxModuleInfo)));
	}

	/**
	 * 封装页面显示模块的详细信息
	 * 
	 * @param qxModuleInfo
	 * @return
	 */
	public Map<String, Object> moduleInfoMap(QxModule qxModuleInfo) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("alias", qxModuleInfo.getAlias());
		map.put("name", qxModuleInfo.getName());
		map.put("pageUrl", qxModuleInfo.getPageUrl());
		map.put("submitUrl", qxModuleInfo.getSubmitUrl());
		map.put("createPerson", qxModuleInfo.getCreatePerson());
		map.put("createTime", DateUtils.convertDate2String("yyyy-MM-dd", qxModuleInfo.getCreateTime()));
		return map;
	}

	/**
	 * 根据传入的模块实体类自动封装模块树
	 * 
	 * @param moduleList
	 *            模块实体类
	 * @return 模块树
	 */
	public static String createModuleJsonTree(List<QxModule> moduleList) {
		StringBuilder jsonData = new StringBuilder();

		// TODO 组装module树

		return jsonData.toString();
	}

	/**
	 * 当拖拽移动模块节点时修改模块信息
	 * 
	 * @throws Exception
	 */
	public void ajaxUpModuleInfoByMoveModule() throws Exception {
		qxModuleService.updateModuoeByMoveNode(qxModule);
	}

	public Long getUserId() {
		return userId;
	}

	public void setUserId(Long userId) {
		this.userId = userId;
	}
}
